from flask import Flask, jsonify, request, Blueprint
from flask_sqlalchemy import SQLAlchemy
from flask_docs import ApiDoc

app = Flask(__name__)
app.config.from_pyfile('config.py')
app.config['SQLALCHEMY_POOL_SIZE']=100
app.config['SQLALCHEMY_MAX_OVERFLOW'] = 20
db = SQLAlchemy(app)

# Using CDN
app.config['API_DOC_CDN'] = True
# Disable document pages
# app.config['API_DOC_ENABLE'] = False
# 需要显示文档的API
app.config['API_DOC_MEMBER'] = ['api']
# # 需要排除的RESTFUL Api 文档
app.config['RESTFUL_API_DOC_EXCLUDE'] = []
ApiDoc(app)
api = Blueprint('api', __name__)
platform = Blueprint('platform', __name__)

from models import *


# 电站数据上传数据库
@api.route('/addData/station_info')
def addData_station():
    """电站数据上传数据库demo

    用于前期测试

    Args:
        'None'

    Returns:
        'Station information updating done'
    """
    station_list = []
    station_list.append(Station(station_id=1, station_name='梁园2_0101方阵_TSM-260PEG5',
                                image='https://file.isolarcloud.com/station/107353/file120161027104749376.jpg',
                                area='三类地区', capacity='594.88kW', location='安徽省合肥市肥东县梁园镇',
                                time_build='2015年12月30日', brief='梁园水面电站0101方阵（1#集点线1#箱变01逆变器方阵，水面电站类型，采用固定支架与天合260W'
                                                                '单面组件。组件倾角25°，组件朝向正南，前后排间距6.5m。组件采用竖向安装，上下两排）'))
    station_list.append(Station(station_id=2, station_name='梁园2_0801方阵_JAP6(DG-60-260/3BB',
                                image='https://file.isolarcloud.com/station/107353/file120161027104749789.jpg',
                                area='三类地区', capacity='594.88kW', location='安徽省合肥市肥东县梁园镇',
                                time_build='2015年12月30日', brief='梁园水面电站0801方阵（2#集点线8#箱变01逆变器方阵，水面电站类型，采用固定支架与晶澳260W'
                                                                '单面单玻组件。组件倾角25°，组件朝向正南，前后排间距6.5m。组件采用竖向安装，上下两排）'))
    station_list.append(Station(station_id=3, station_name='梁园1--双面', image='1',
                                area='三类地区', capacity='5.015kW', location='安徽省合肥市肥东县梁园镇',
                                time_build='2018年1月', brief='隆基LR6-60BP-295M双面单晶组件（带边框），17块'))
    station_list.append(Station(station_id=4, station_name='梁园3--双面', image='1',
                                area='三类地区', capacity='4.64kW', location='安徽省合肥市肥东县梁园镇',
                                time_build='2018年1月', brief='中来JWN-D60N-290W双面单晶组件（不带边框），16块'))
    station_list.append(Station(station_id=5, station_name='龙游奔塘_0101方阵_TSM-270_PEG5',
                                image='https://file.isolarcloud.com/station/158499/file120181031173441235.jpg',
                                area='四类地区', capacity='706.32kW', location='浙江省衢州市龙游县小南海镇宗元村',
                                time_build='2017年12月30日', brief='龙游奔塘电站0101方阵（1区汇流箱01-08路），平地电站类型，采用固定支架与天合光能270W'
                                                                '单面组件。组件倾角20°，组件朝向正南，前后排间距>5.7m，组件采用竖向安装，上下两排。'))
    station_list.append(Station(station_id=6, station_name='龙游奔塘_1402方阵_RSM60-6-270P',
                                image='https://file.isolarcloud.com/station/158499/file120181031173446620.jpg',
                                area='四类地区', capacity='745.2kW', location='浙江省衢州市龙游县小南海镇宗元村',
                                time_build='2017年12月30日', brief='龙游奔塘电站1402方阵（14区汇流箱09-16路），平地电站类型，采用固定支架与东方日升270W'
                                                                '单面组件。组件倾角20°，组件朝向正南，前后排间距>5.7m。组件采用竖向安装，上下两排。'))
    station_list.append(Station(station_id=7, station_name='内蒙古太仆寺旗学校方阵',
                                image='http://5b0988e595225.cdn.sohucs.com/images/20181218/b7db81dedad040bd97215985f403c439.jpeg',
                                area='一类地区', capacity='5.0886MW', location='内蒙古自治区锡林郭勒盟太仆寺旗红旗镇红旗村',
                                time_build='2018年12月18日', brief='本项目位于内蒙古自治区锡林郭勒盟太仆寺旗红旗镇红旗村，是锡林郭勒盟首个并网投产的村级光伏扶贫电站，也是内蒙古自治区第一个一次性全容量并网发电的联村电站。\
                                平地/山地电站类型，采用固定可调支架。组件朝向正南，前后排间距5m。组件采用竖向安装，上下两排。'))
    station_list.append(Station(station_id=8, station_name='左云铭阳_3301方阵_JAP6-60-270/4BB/RE',
                                image='https://file.isolarcloud.com/station/108791/file120161027104601685.jpg',
                                area='二类地区', capacity='546.48kW', location='山西省大同市左云县代家沟',
                                time_build='2016年6月24日',
                                brief='左云铭阳电站3301方阵（33区汇流箱01-06路），山地电站类型，采用固定支架与晶澳270W单面组件。组件倾角37°，组件朝向正南。'))
    station_list.append(Station(station_id=9, station_name='左云铭阳_2102方阵_CS6K-265P-FG',
                                image='https://file.isolarcloud.com/station/108791/file120161027104551311.jpg',
                                area='二类地区', capacity='1.084MW', location='山西省大同市左云县店湾镇代家沟村',
                                time_build='2016年6月24日',
                                brief='左云铭阳电站2102方阵（21区汇流箱09-16路），山地电站类型，采用手动可调支架与阿特斯双玻265W组件。夏季斜面角度调整到9度，春秋调整为37'
                                      '度，冬季调整为54度'))
    station_list.append(Station(station_id=10, station_name='自持实证电站8.5kW', image='1',
                                area='三类地区', capacity='8.5kW', location='阳光三星产业园',
                                time_build='2020年7月', brief='平地电站类型，采用隆基LR4-78ZBD-470M组件，平单轴跟踪+双面组件'))
    station_list.append(Station(station_id=11, station_name='自持实证电站8.8kW', image='1',
                                area='三类地区', capacity='8.8kW', location='阳光三星产业园',
                                time_build='2020年7月', brief='平地电站类型，采用隆基LR4-72HBD-440M组件，平单轴跟踪+双面组件'))
    station_list.append(Station(station_id=12, station_name='自持实证电站7.7kW', image='1',
                                area='三类地区', capacity='7.7kW', location='阳光三星产业园',
                                time_build='2020年7月', brief='平地电站类型，采用隆基LR6-72HPH-385M组件，平单轴跟踪+单面组件'))
    station_list.append(Station(station_id=13, station_name='自持实证电站8.8kW', image='1',
                                area='三类地区', capacity='8.8kW', location='阳光三星产业园',
                                time_build='2020年7月', brief='平地电站类型，采用隆基LR4-72HPH-440M组件，平单轴跟踪+单面组件'))
    # 添加数组信息到session
    db.session.add_all(station_list)
    # 提交数组信息保存到数据库
    db.session.commit()
    # 关闭session
    db.session.close()
    return 'Station information updating done'


# 获取电站列表
@api.route('/getData/station_list')
def getData_stationList():
    """获取电站列表

    @@@
    #### args
    - ##### none
    #### return
    - ##### json

    | args | nullable | type | remark |
    |--------|--------|--------|--------|
    | station_id | false | Integer | 电站id |
    | station_name | true | TEXT | 电站/方阵名称 |
    | image | true | TEXT | 图片URL |
    | area | true | TEXT | 地区类型 |
    | capacity | true | TEXT | 电站/方阵容量 |
    | feature | true | TEXT | 电站特征 |

    @@@
    """
    station_list = db.session.query(Station.station_id, Station.station_name, Station.image, Station.area,
                                    Station.capacity, Station.feature).all()
    return jsonify(JsonHelper.jsonBQlist(station_list))


# 获取电站详情
@api.route('/getData/station_info', methods=['GET', 'POST'])
def getData_stationInfo():
    """获取电站详情

    """
    if request.method == 'POST':
        arg_id = request.get_json()['id']
    else:
        arg_id = request.args.get('id')
    station_list = db.session.query(Station.station_id, Station.station_name, Station.image, Station.location,
                                    Station.area, Station.time_build, Station.capacity, Station.brief, Station.feature).filter_by(
        station_id=arg_id)
    return jsonify(JsonHelper.jsonBQlist(station_list))


# 获取仿真结果
@api.route('/getData/monthly_result', methods=['GET', 'POST'])
def getData_monthly_result():
    """获取电站仿真结果与其他气象结果（月级）

    @@@
    #### args
    - ##### id
    #### return
    - ##### json

    [
    {
        "category": "气象数据",
        "charts": [
            {
                "data": [
                    6.94,
                    6.76,
                    16.76,
                    22.34,
                    27.51,
                    10.67,
                    20.9,
                    21.25,
                    13.89,
                    13.85,
                    17.06,
                    10.94
                ],
                "title": "月平均峰值温度",
                "type": "bar",
                "unit": "℃"
            },
            {
                "data": [
                    459.26,
                    411.39,
                    799.19,
                    764.2,
                    901.16,
                    258.57,
                    0.0,
                    197.16,
                    329.07,
                    395.74,
                    662.17,
                    580.42
                ],
                "title": "月平均斜面总辐照",
                "type": "line",
                "unit": "W/m2"
            }
        ]
    },
    {
        "category": "仿真结果",
        "charts": [
            {
                "data": [
                    2.15,
                    1.81,
                    3.69,
                    3.57,
                    4.06,
                    1.1,
                    0.0,
                    0.0,
                    0.27,
                    1.76,
                    3.0,
                    2.81
                ],
                "title": "月平均峰值功率",
                "type": "bar",
                "unit": "kW"
            },
            {
                "data": [
                    337.66,
                    200.71,
                    626.7,
                    602.78,
                    721.24,
                    206.95,
                    0.0,
                    0.0,
                    17.74,
                    223.02,
                    399.16,
                    398.75
                ],
                "title": "月平均发电量",
                "type": "bar",
                "unit": "kWh"
            }
        ]
    }
]

    @@@
    """
    if request.method == 'POST':
        arg_id = request.get_json()['id']
    else:
        arg_id = request.args.get('id')
    monthly_result = db.session.query(Monthly_result.station_id, Monthly_result.weather_data, Monthly_result.solar_data,
                                      Monthly_result.power_data, Monthly_result.generation_data).filter_by(
        station_id=arg_id)
    monthly_result = JsonHelper.jsonBQlist(monthly_result)
    for key in ['weather_data', 'solar_data', 'power_data', 'generation_data']:
        monthly_result[0][key] = JsonHelper.string_list(monthly_result[0][key])
    result = []
    result.append({'category': '气象数据', 'charts': [{'title': '月平均峰值温度',
                                                   'type': 'bar',
                                                   'data': monthly_result[0]['weather_data'],
                                                   'unit': '℃'},
                                                  {'title': '月平均斜面总辐照',
                                                   'type': 'line',
                                                   'data': monthly_result[0]['solar_data'],
                                                   'unit': 'W/m2'}
                                                  ]})
    result.append({'category': '仿真结果', 'charts': [{'title': '月平均峰值功率',
                                                   'type': 'bar',
                                                   'data': monthly_result[0]['power_data'],
                                                   'unit': 'kW'},
                                                  {'title': '月平均发电量',
                                                   'type': 'bar',
                                                   'data': monthly_result[0]['generation_data'],
                                                   'unit': 'kWh'}]})

    return jsonify(result)


@api.route('/hello')
def hello():
    return 'Hello World!'


app.register_blueprint(api, url_prefix='/api')

if __name__ == '__main__':
    app.run(
        host='0.0.0.0',  # 192.168.136.197
        port=5000,
        debug=True
    )
